/**
 * Copyright 2019 Inc.
 **/
package com.myz.service.gateway.config;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

import java.util.Objects;

/**
 * @author maoyz0621 on 19-12-5
 * @version: v1.0
 */
@Configuration
public class GatewayConfiguration {

    /**
     * 进行路由转发，将请求进行处理，最后转发到目标的下游服务
     * <p>
     * 上面创建的route可以让请求“/get”请求都转发到“http://httpbin.org/get”。在route配置上，我们添加了一个filter，该filter会将请求添加一个header,key为hello，value为world。
     *
     * @param builder
     * @return
     */
    // @Bean
    // public RouteLocator myRoutes(RouteLocatorBuilder builder) {
    //     String uri = "http://httpbin.org:80";
    //     return builder.routes()
    //             .route(p -> p
    //                     .path("/get")
    //                     .filters(f -> f.addRequestHeader("Hello", "World"))
    //                     .uri(uri))
    //             // 我们使用了另外一个router，该router使用host去断言请求是否进入该路由，当请求的host有“*.hystrix.com”，都会进入该router，
    //             // 该router中有一个hystrix的filter,该filter可以配置名称、和指向性fallback的逻辑的地址，比如本案例中重定向到了“/fallback”。
    //             .route(p -> p
    //                     .host("*.hystrix.com")
    //                     .filters(f -> f
    //                             .hystrix(config -> config
    //                                     .setName("mycmd")
    //                                     .setFallbackUri("forward:/fallback")))
    //                     .uri(uri)
    //             )
    //             .build();
    // }


    /**
     * 自定义过器
     */
    // @Bean
    // public RouteLocator myRoutes(RouteLocatorBuilder builder) {
    //     String uri = "http://httpbin.org:80";
    //     return builder.routes()
    //             .route(p -> p
    //                     .path("/customer/**")
    //                     .filters(f -> f.filter(new RequestTimeFilter())
    //                     .addResponseHeader("X-Response-Default-Foo", "Default-Bar"))
    //                     .uri(uri)
    //             .order(0)
    //             .id("customer_filter_route"))
    //             .build();
    // }
    @Bean
    public RequestTimeGatewayFilterFactory requestTimeGatewayFilterFactory() {
        return new RequestTimeGatewayFilterFactory();
    }

    // @Bean
    public TokenFilter tokenFilter() {
        return new TokenFilter();
    }

    @Bean
    public HostAddrKeyResolver hostAddrKeyResolver() {
        return new HostAddrKeyResolver();
    }

    @Bean
    public UriKeyResolver uriKeyResolver() {
        return new UriKeyResolver();
    }

    /**
     * 可以以用户的维度去限流
     */
    @Bean
    public KeyResolver userKeyResolver() {
        return exchange -> Mono.just(Objects.requireNonNull(exchange.getRequest().getQueryParams().getFirst("user")));
    }

}
